-- 2022-7-28

---[[
    -- Lua语言在的函数可以是可变长参数函数，即可以支持数量可变的parameters参数
    function add (...)
        local s = 0
        for _ , v in ipairs{...} do --注意此处为{}而不是(),这儿将参数转换成了表
            s = s + v
        end
        return s
    end
    print(add(1,2,3,4,5))

    -- 参数列表中的三个点(...)表示该函数的参数是可以变长的。
    -- 当这个函数被调用时，Lua内部会把它的所有参数收集起来，我们把这些被收集起来的参数称为额外参数
    -- 当函数要访问这些参数时仍需用到三个点，但不同的是此时这三个点是作为一个表达式来使用的

    -- 要遍历可边长参数，函数可使用表达式{...}将可变长参数放在一个表中
    -- 但是如果参数中包含无效的nil，那么获得的表可能不再是一个有效的序列，此时无法判断是否以nil结尾
    -- 对于这种情况，Lua语言提供了函数table.pack
    -- 该函数像表达式{...}一样保存所有的参数然后返回，但是这个表还有一个保存了参数个数的额外字段"n"
    tb = table.pack(1,2,3,4,5,6,7,nil,nil)
    print(tb.n)
    for i = 1, tb.n do
        print(tb[i])
    end

    -- 另一种遍历函数的可变长参数的方法是使用函数select
    -- 函数select总是具有一个固定的参数selector，以及数量可变的参数
    --      如果参数为数值n，返回第n个包括第n个以后的参数
    --      如果参数为字符"#"，返回额外参数的个数
    -- 对于参数较多的情况，多次带有很多参数调用函数select会超过创建表的开销
--]]